import { showMsg } from './showMsg'
import { ElMessageBox } from 'element-plus'

/**
 * 用户登出函数，用于处理用户退出登录的逻辑。
 * 该函数会根据传入的参数和用户状态执行不同的操作：
 * 1. 如果 `type` 为真值，直接执行退出登录逻辑。
 * 2. 如果用户未登录，提示用户登录并跳转到登录页面。
 * 3. 如果用户已登录，弹出确认框，用户确认后执行退出登录逻辑。
 *
 * @param {Object} vm - Vue 组件实例，用于访问 Vuex store 和路由。
 * @param {boolean} type - 控制是否直接执行退出登录逻辑：
 *   - `true`：直接退出登录，不弹出确认框。
 *   - `false` 或未提供：弹出确认框，用户确认后退出登录。
 * @param {string} msg - 当 `type` 为 `true` 时，显示的错误消息内容。
 *
 * @example
 * // 直接退出登录
 * layout(this, true, '会话已过期，请重新登录')
 *
 * // 弹出确认框后退出登录
 * layout(this)
 */
export function layout(vm, type, msg)
{
  // 确保 vm 存在
  if (!vm || !vm.$store || !vm.$router)
  {
    showMsg('系统错误', '组件实例或依赖缺失，请刷新页面', 'error')
    return
  }

  // 检查用户登录状态，使用 getters.isLoggedIn
  const isLoggedIn = vm.$store.getters.isLoggedIn

  if (type)
  {
    const ws = vm.$store.getters['websocket/getWebSocket']
    if (ws && ws.readyState === WebSocket.OPEN)
    {
      // 安全地获取 userId，确保 user 不为 null
      const userId = vm.$store.getters.getUser?.id || null
      if (!userId)
        showMsg('用户信息缺失', '无法发送退出消息，请检查登录状态', 'warning')
      else
      {
        ws.send(
          JSON.stringify({
            type: 'logout',
            userId,
            timestamp: new Date().toISOString()
          })
        )
      }
    }
    // 清除用户信息
    vm.$store.dispatch('logout')
    showMsg('请求失败', msg || '会话已过期，请重新登录', 'error')
    vm.$router.push('/login')
    return
  }

  // 如果用户未登录，直接跳转登录页面
  if (!isLoggedIn)
  {
    showMsg('未登录', '🤨您似乎还没有登录，赶快登录吧~', 'warning')
    vm.$router.push('/login')
    return
  }

  // 弹出确认框
  ElMessageBox.confirm('即将退出登录', '', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  })
    .then(() =>
    {
      const ws = vm.$store.getters['websocket/getWebSocket']
      const userId = vm.$store.getters.getUser?.id || null

      if (ws && ws.readyState === WebSocket.OPEN)
      {
        if (userId)
        {
          ws.send(
            JSON.stringify({
              type: 'logout',
              userId,
              timestamp: new Date().toISOString()
            })
          )
        }
        else
          showMsg('用户ID确实', '跳过WebScokets注销消息', 'warning')
      }
      // 清除用户信息
      vm.$store.dispatch('logout')
      // 显示登出成功消息
      showMsg('登出成功', '👋 期待再次见到你~', 'success')
      // 跳转到登录页
      vm.$router.push('/login')
    })
    .catch(() =>
    {
      // 用户点击“取消”
      showMsg('已取消', '🥱您取消了退出登录操作~', 'info')
    })
    .catch((error) =>
    {
      // 处理 ElMessageBox 可能的错误
      console.error('MessageBox error:', error)
      showMsg('系统错误', '退出登录操作失败，请重试', 'error')
    })
}
